#include <iostream>
#include <vector>

void bar(int &&val) { std::cout << val << std::endl; }

// int&& foo(int&& val){
////return static_cast<int&&>(val);
////int && res = val;

////return res;

// return val;
//}

class A {
public:
  A() { std::cout << "A()" << std::endl; }

  A(const A &a) { std::cout << "A(const A& a)" << std::endl; }

  A(A &&a) { std::cout << "A(A&& a)" << std::endl; }

  A &operator=(const A &a) {
    std::cout << "A& operator=(const A& a)" << std::endl;
    return *this;
  }

  A &&operator=(A &&a) {
    std::cout << "A&& operator=(A&& a)" << std::endl;
    return static_cast<A &&>(*this);
  }

  ~A() { std::cout << "~A()" << std::endl; }
};

void foo(A val) { std::cout << "foo_value" << std::endl; }

// void foo(A &val) {
// std::cout << "foo_lvalue_ref" << std::endl;
//}

// void foo(A &&val) {
// std::cout << "foo_rvalue_ref" << std::endl;
//}

A getA() { return A(); }

int main() {
  // A a;
  //  foo(getA());
  //  int a = 3;
  //  int b = 4;
  //  std::cout << std::min(a, b) << std::endl;

  // std::vector<int> vec(100);
  //
  // for (int val : vec) {
  //     std::cout << val << std::endl;
  // }

  std::string str(2, 'x');
  std::cout << str << std::endl;
  std::cout << str.size() << std::endl;

  std::cout << "HW" << std::endl;
}
